
//3267.统计相似相等数对II
class Solution {
public:
    int countPairs(vector<int>& nums) {
        int n=nums.size();
        sort(nums.begin(),nums.end());   //先进行排序,防止数小的无法交换为数大的
        unordered_map<int,int> m;

        int ret=0;
        for(int i=0;i<n;i++)
        {
            unordered_set<int> tmp;   //存储当前数据经过之多两次交换后的值
            tmp.insert(nums[i]);       //存储数字本身
            string str=to_string(nums[i]);    //将整数转化为字符串方便交换
            int len=str.size();  
            for(int i=0;i<len;i++)
            {
                for(int j=i+1;j<len;j++) 
                {
                    swap(str[i],str[j]);
                    tmp.insert(stoi(str));   //交换一次
                    for(int p=i+1;p<len;p++)
                    {
                        for(int q=i+1;q<len;q++)
                        {
                            swap(str[p],str[q]);   //交换两次
                            tmp.insert(stoi(str));
                            swap(str[p],str[q]);    //换回来
                        }
                    }
                    swap(str[i],str[j]);   //换回来
                }
            }
            for(auto x:tmp)
            ret+=m.count(x)?m[x]:0;   //遍历交换后的数字,在前面找又没有相同的

            m[nums[i]]++;   //将当前位置加入和左边进行维护
        }
        return ret;
    }
};